//package cur.nature.tinyorm.core;
//
//import com.alibaba.fastjson2.JSON;
//import cur.nature.tinyorm.core.annotation.Column;
//import cur.nature.tinyorm.core.annotation.Table;
//import cur.nature.tinyorm.core.common.OrmUtil;
//import cur.nature.tinyorm.core.common.MBean;
//import cur.nature.tinyorm.core.bean.PageBean;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.jdbc.core.JdbcTemplate;
//
//import java.lang.reflect.Field;
//import java.math.BigDecimal;
//import java.sql.Connection;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.time.ZonedDateTime;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
//public class JdbcHelper {
//    private static Logger LOG = LoggerFactory.getLogger(JdbcHelper.class);
//
//    // 组装参数
//    public static MBean.M2<String, List<Object>> parseParam(String sql, Map<String, Object> param) {
//        List<Object> paramList = new ArrayList<>();
//        // 组装参数
//        if (param != null && param.size() > 0) {
//            for (Map.Entry<String, Object> entry : param.entrySet()) {
//                // 循环替换参数
//                while (true) {
//                    if (!sql.contains("#{" + entry.getKey() + "}")) {
//                        break;
//                    } // 找不到则退出
//                    sql = sql.replaceAll("#\\{" + entry.getKey() + "}", " ? ");
//                    paramList.add(entry.getValue());
//                }
//            }
//        }
//        return new MBean.M2<>(sql, paramList);
//    }
//
//    // 获取所有字段
//    public static List<Field> getField(Class<?> clazz) {
//        // 获取字段
//        List<Field> list = new ArrayList<>();
//        Field[] fields = clazz.getDeclaredFields();
//        list.addAll(Arrays.asList(fields));
//        // 获取父类字段
//        Class<?> superClazz = clazz.getSuperclass();
//        if (superClazz != null) {
//            Field[] superFields = superClazz.getDeclaredFields();
//            list.addAll(Arrays.asList(superFields));
//        }
//        return list;
//    }
//
//    // 从类中获取字段信息
//    public static MBean.M3<String, List<String>, String> getTableInfo(Class<?> clazz) {
//        // 获取主表名
//        Table table = clazz.getAnnotation(Table.class);
//        String talbeName = (table != null ? table.name() : null);
//        // 获取字段
//        String idColumn = null;
//        List<String> list = new ArrayList<>();
//        for (Field field : getField(clazz)) {
//            Column column = field.getDeclaredAnnotation(Column.class);
//            if (column == null) {
//                continue;
//            }
//            if (column.isPK()) {
//                idColumn = column.name();
//            }
//            list.add(column.name());
//        }
//        return new MBean.M3<>(talbeName, list, idColumn);
//    }
//
//    private static boolean isBaseType(Class targetClass) {
//        if (targetClass == Map.class
//                || targetClass == String.class || targetClass == Integer.class
//                || targetClass == Long.class || targetClass == Float.class
//                || targetClass == Double.class || targetClass == BigDecimal.class || targetClass == Date.class) {
//            return true;
//        }
//        return false;
//    }
//
//    // 将map 转为 对象
//    public static <T> List<T> parseList(List<Map<String, Object>> resultList, Class<T> targetClass, List<Field> fieldList) throws Exception {
//        if (isBaseType(targetClass)) {
//            return (List<T>) resultList;
//        }
//        // 查询并设值
//        List<T> result = new ArrayList();
//        if (resultList != null && resultList.size() > 0) {
//            // 判断字段是否为空
//            if (fieldList == null || fieldList.size() == 0) {
//                fieldList = getField(targetClass);
//            }
//            // 对字段名称特殊化处理
//            Map<String, String> nameSpec = new HashMap<>();
//            Map<String, Object> one = resultList.get(0);
//            for (String key : one.keySet()) {
//                nameSpec.put(key.replaceAll("_", "").toLowerCase(), key);
//            }
//            // 设值
//            for (Map<String, Object> map : resultList) {
//                T object = parseObject(map, targetClass, fieldList, nameSpec);
//                result.add(object);
//            }
//        }
////        LOG.info(JsonUtil.toJSONString(result));
//        return result;
//    }
//
//    // 将map 转为 对象
//    public static <T> T parseObject(Map<String, Object> map, Class<T> targetClass,
//                                    List<Field> fieldList, Map<String, String> nameSpec) throws Exception {
//        if (map == null) {
//            return null;
//        }
//        if (targetClass == Map.class) {
//            return (T) map;
//        }
//        // 查询并设值
//        if (map != null) {
//            Object resObj = targetClass.getDeclaredConstructor().newInstance();
//            // 对字段名称特殊化处理
//            if (nameSpec == null) {
//                nameSpec = new HashMap<>();
//                for (String key : map.keySet()) {
//                    nameSpec.put(key.replaceAll("_", "").toLowerCase(), key);
//                }
//            }
//            // 判断字段是否为空
//            if (fieldList == null || fieldList.size() == 0) {
//                fieldList = getField(targetClass);
//            }
//            // 设值 字段
//            for (Field field : fieldList) {
//                Object obj = map.get(nameSpec.get(field.getName().toLowerCase()));
//                setField(resObj, field, obj);
//            }
//            return (T) resObj;
//        }
//        return null;
//    }
//
//    // 返回字段名及字段值
//    public static MBean.M3<Map<String, Object>, String, List<MBean.M2<String, Object>>>
//    packUpdateFields(Object obj, boolean isAllColumns) throws IllegalAccessException {
//        Map<String, Object> resultMap = new HashMap<>();
//        // 查出所有字段
//        List<Field> fieldList = getField(obj.getClass());
//        // 获取主表名
//        Table table = obj.getClass().getAnnotation(Table.class);
//        String talbeName = (table != null ? table.name() : null);
//        List<MBean.M2<String, Object>> idColumn = new ArrayList<>();
//        // 拼接字段及字段值
//        for (Field field : fieldList) {
//            Column column = field.getDeclaredAnnotation(Column.class);
//            if (column == null) {
//                continue;
//            }
//            // 主键
//            if (column.isPK()) {
//                field.setAccessible(true);
//                MBean.M2<String, Object> pk = new MBean.M2<>(column.name(), field.get(obj));
//                idColumn.add(pk);
//                continue;
//            }
//            // 判断是否为空
//            field.setAccessible(true);
//            Object value = field.get(obj);
//            if (value == null && !isAllColumns) {
//                continue;
//            }
//            //设置值
//            resultMap.put(column.name(), value);
//        }
//        // 返回三个值 v1:字段及字段值, v2:表名, v3: 主键及值
//        return new MBean.M3<>(resultMap, talbeName, idColumn);
//    }
//
//    // 获取所有字段
//    public static String getColumns(Class<?> clazz) {
//        return getColumns(clazz, null);
//    }
//
//    // 获取所有字段
//    public static String getColumns(Class<?> clazz, final String prefix) {
//        List<Field> fieldList = getField(clazz);
//        List<String> columnList = new ArrayList<>(fieldList.size());
//        for (Field field : getField(clazz)) {
//            Column column = field.getDeclaredAnnotation(Column.class);
//            if (column == null) {
//                continue;
//            }
//            columnList.add(column.name());
//        }
//        columnList.replaceAll(s -> "`" + s + "`");
//        if (OrmUtil.isNotEmpty(prefix)) {
//            return columnList.stream().map(column -> prefix + column).collect(Collectors.joining(","));
//        }
//        return columnList.stream().collect(Collectors.joining(","));
//    }
//
//    // 获取表名
//    public static String getTableName(Class<?> clazz) {
//        // 获取主表名
//        Table table = clazz.getAnnotation(Table.class);
//        String talbeName = (table != null ? table.name() : null);
//        return talbeName;
//    }
//
//
//    // 查询列表
//    public static Map<String, Object> queryMap(JdbcTemplate template, String sql, Map<String, Object> param) {
//        List<Object> paramList = new ArrayList<>();
//        // 组装参数
//        if (param != null && param.size() > 0) {
//            for (Map.Entry<String, Object> entry : param.entrySet()) {
//                // 循环替换参数
//                while (true) {
//                    if (!sql.contains("#{" + entry.getKey() + "}")) {
//                        break;
//                    } // 找不到则退出
//                    sql = sql.replaceAll("#\\{" + entry.getKey() + "}", " ? ");
//                    paramList.add(entry.getValue());
//                }
//            }
//        }
//        // 查询
//        LOG.info("sql: " + sql);
//        LOG.info("params: " + JSON.toJSONString(paramList));
//        Map<String, Object> resultMap = template.queryForMap(sql, paramList.toArray());
//        return resultMap;
//    }
//
//    public static <T> PageBean<T> queryForPage(JdbcTemplate template, String sql, PageBean<T> pagination, Class<T> resultType) throws Exception {
//        return queryForPage(template, sql, null, pagination, resultType);
//    }
//
//    public static <T> PageBean<T> queryForPage(JdbcTemplate template, String sql, PageBean<T> pagination,
//                                               Map<String, Object> param, Class<T> resultType) throws Exception {
//        // 组装参数
//        MBean.M2<String, List<Object>> paramResult = JdbcHelper.parseParam(sql, param);
//        sql = paramResult.v1;
//        List<Object> paramList = paramResult.v2;
//        return queryForPage(template, sql, paramList.toArray(), pagination, resultType);
//    }
//
//    public static <T> PageBean<T> queryForPage(JdbcTemplate template, String sql, Object[] param, PageBean<T> pagination, Class<T> resultType) throws Exception {
//        //获取记录条数
//        String countSql = "select count(1) as count from (" + sql + ") temp";
//        LOG.info("统计总数SQL: " + countSql);
//        Long count = template.queryForObject(countSql, Long.class, param);
//        LOG.info("row count: " + count);
//        if (null == count || count == 0) {
//            return pagination;
//        }
//        pagination.setTotal(count);
//        pagination.setPages((count + pagination.getPageSize() - 1) / pagination.getPageSize());
//
//        //查询数据列表
//        List<Object> paramList = new ArrayList<>(Arrays.asList(param));
//        String databaseType = null;
//        try (Connection connection = template.getDataSource().getConnection()) {
//            databaseType = connection.getMetaData().getDatabaseProductName();
//        } catch (Exception ex) {
//            LOG.error("conn err: ", ex);
//        }
//        if ("postgresql".equalsIgnoreCase(databaseType)) {
//            sql += " limit ? offset ? ";
//            paramList.add(pagination.getPageSize());
//            paramList.add((pagination.getPageNum() - 1L) * pagination.getPageSize());
//        } else {//默认mysql
//            sql += " limit ? , ? ";
//            paramList.add((pagination.getPageNum() - 1) * pagination.getPageSize());
//            paramList.add(pagination.getPageSize());
//        }
//        List<Map<String, Object>> dataList = queryList(template, sql, paramList.toArray());
//        List<T> data = parseList(dataList, resultType, null);
//        pagination.setList(data);
//        pagination.setSize(data.size());
//        return pagination;
//    }
//
//    public static <T> List<T> queryForListCust(JdbcTemplate template, String sql, Class<T> resultType) throws Exception {
//        return queryForListCust(template, sql, null, resultType);
//    }
//
//    public static <T> List<T> queryForListCust(JdbcTemplate template, String sql, Map<String, Object> param, Class<T> resultType) throws Exception {
//        // 查询
//        List<T> list = queryForListJdbc(template, sql, param, resultType);
//        LOG.info("查询参数: " + JSON.toJSONString(param));
//        return list;
//    }
//
//    public static <T> List<T> queryForListJdbc(JdbcTemplate template, String sql, Map<String, Object> param, Class<T> resultType) throws Exception {
//        LOG.info("查询SQL: " + sql);
//        List<Map<String, Object>> dataList = JdbcHelper.queryList(template, sql, param);
//        List<T> data = JdbcHelper.parseList(dataList, resultType, null);
//        return data;
//    }
//
//    public static <T> T queryForObjectCust(JdbcTemplate template, String sql, Class<T> resultType) throws Exception {
//        List<T> list = queryForListCust(template, sql, resultType);
//        if (list != null && list.size() > 1) {
//            throw new Exception("结果集大于2行");
//        }
//        if (list != null && list.size() > 0) {
//            T t = list.get(0);
//            if (resultType == Map.class) {
//                return t;
//            }
//            for (Object value : ((Map) t).values()) {
//                return (T) value;
//            }
//        }
//
//        return null;
//    }
//
//    // 查询列表
//    public static List<Map<String, Object>> queryList(JdbcTemplate template, String sql, Map<String, Object> param) {
//        // 组装参数
//        MBean.M2<String, List<Object>> paramResult = parseParam(sql, param);
//        sql = paramResult.v1;
//        List<Object> paramList = paramResult.v2;
//        // 查询
//        List<Map<String, Object>> resultList = queryList(template, sql, paramList.toArray());
//        return resultList;
//    }
//
//    public static List<Map<String, Object>> queryList(JdbcTemplate template, String sql, Object[] param) {
//        // 查询
//        LOG.info("sql: " + sql);
//        LOG.info("params: " + JSON.toJSONString(param));
//        List<Map<String, Object>> resultList = template.queryForList(sql, param);
//        return resultList;
//    }
//
//    // 插入
//    public static int insert(JdbcTemplate template, Object obj, boolean isAllColumns) throws IllegalAccessException {
//        // 查出字段名及字段值
//        MBean.M3<Map<String, Object>, String, List<MBean.M2<String, Object>>> packReturn = packUpdateFields(obj, isAllColumns);
//        Map<String, Object> valueMap = packReturn.v1; // 字段及字段值
//        String tableName = packReturn.v2; // 表名
//        List<MBean.M2<String, Object>> idColumnList = packReturn.v3; // 主键及值
//        // 主楗
//        if (idColumnList != null && idColumnList.size() > 0) {
//            for (MBean.M2<String, Object> idColumn : idColumnList) {
//                if (idColumn.v2 != null) {
//                    valueMap.put(idColumn.v1, idColumn.v2);
//                }
//            }
//        }
//
//        // 分析
//        List<String> columnList = new ArrayList();
//        List<String> paramList = new ArrayList<>();
//        List<Object> valueList = new ArrayList<>();
//        for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
//            columnList.add(entry.getKey());
//            paramList.add(" ? ");
//            valueList.add(entry.getValue());
//        }
//        // 拼接sql
//        String column = "`" + columnList.stream().collect(Collectors.joining("`,`")) + "`";
//        String param = paramList.stream().collect(Collectors.joining(","));
//        String sql = "INSERT INTO " + tableName + " (" + column + ") VALUES (" + param + ")";
//        // 执行sql
//        LOG.info("sql: " + sql);
//        LOG.info("params:" + JSON.toJSONString(valueMap));
//        return template.update(sql, valueList.toArray());
//    }
//
//    public static int insert(JdbcTemplate template, Object obj, String tableName, boolean isAllColumns) throws IllegalAccessException {
//        // 查出字段名及字段值
//        MBean.M3<Map<String, Object>, String, List<MBean.M2<String, Object>>> packReturn = packUpdateFields(obj, isAllColumns);
//        Map<String, Object> valueMap = packReturn.v1; // 字段及字段值
//        tableName = OrmUtil.isNotEmpty(tableName) ? tableName : packReturn.v2; // 表名
//        List<MBean.M2<String, Object>> idColumnList = packReturn.v3; // 主键及值
//        // 主楗
//        if (idColumnList != null && idColumnList.size() > 0) {
//            for (MBean.M2<String, Object> idColumn : idColumnList) {
//                if (idColumn.v2 != null) {
//                    valueMap.put(idColumn.v1, idColumn.v2);
//                }
//            }
//        }
//
//        // 分析
//        List<String> columnList = new ArrayList();
//        List<String> paramList = new ArrayList<>();
//        List<Object> valueList = new ArrayList<>();
//        for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
//            columnList.add(entry.getKey());
//            paramList.add(" ? ");
//            valueList.add(entry.getValue());
//        }
//        // 拼接sql
//        String column = "`" + columnList.stream().collect(Collectors.joining("`,`")) + "`";
//        String param = paramList.stream().collect(Collectors.joining(","));
//        String sql = "INSERT INTO `" + tableName + "` (" + column + ") VALUES (" + param + ")";
//        // 执行sql
//        LOG.info("sql: " + sql);
//        LOG.info("params:" + JSON.toJSONString(valueMap));
//        return template.update(sql, valueList.toArray());
//    }
//
//    public static int[] batchInsert(JdbcTemplate template, List list) throws IllegalAccessException {
//        return batchInsert(template, list, null);
//    }
//
//    // 批量插入
//    public static int[] batchInsert(JdbcTemplate template, List list, String tableName) throws IllegalAccessException {
//        if (list == null || list.size() == 0) {
//            return new int[]{0};
//        }
//
//        String sql = null;
//        List<String> columnList = new ArrayList();
//        List<String> paramList = new ArrayList<>();
//        List<Object[]> values = new ArrayList<>();
//        for (int i = 0; i < list.size(); i++) {
//            Object obj = list.get(i);
//            // 查出字段名及字段值
//            MBean.M3<Map<String, Object>, String, List<MBean.M2<String, Object>>> packReturn = packUpdateFields(obj, true);
//            Map<String, Object> valueMap = packReturn.v1; // 字段及字段值
//            tableName = OrmUtil.isNotEmpty(tableName) ? tableName : packReturn.v2; // 表名
//            List<MBean.M2<String, Object>> idColumnList = packReturn.v3; // 主键及值
//            // 主楗
//            if (idColumnList != null && idColumnList.size() > 0) {
//                for (MBean.M2<String, Object> idColumn : idColumnList) {
//                    if (idColumn.v2 != null) {
//                        valueMap.put(idColumn.v1, idColumn.v2);
//                    }
//                }
//            }
//            // 分析
//            List<Object> valueList = new ArrayList<>();
//            for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
//                if (i == 0) {
//                    columnList.add(entry.getKey());
//                    paramList.add(" ? ");
//                }
//                valueList.add(entry.getValue());
//            }
//            values.add(valueList.toArray());
//            if (i == 0) {
//                // 拼接sql
//                String column = "`" + columnList.stream().collect(Collectors.joining("`,`")) + "`";
//                String param = paramList.stream().collect(Collectors.joining(","));
//                sql = (sql == null ? "INSERT INTO `" + tableName + "` (" + column + ") VALUES (" + param + ")" : sql);
//            }
//        }
//        // 执行sql
//        LOG.info("sql: " + sql);
//        LOG.info("params:" + values.size());
//        return template.batchUpdate(sql, values);
//    }
//
//    public static int update(JdbcTemplate template, Object obj, String condition,
//                             boolean isAllColumns, boolean updateById) throws IllegalAccessException {
//        return update(template, obj, condition, isAllColumns, updateById, null);
//    }
//
//    // 更新
//    public static int update(JdbcTemplate template, Object obj, String condition,
//                             boolean isAllColumns, boolean updateById, String tableName) throws IllegalAccessException {
//        condition = (condition == null ? "" : condition);
//        // 查出字段名及字段值
//        MBean.M3<Map<String, Object>, String, List<MBean.M2<String, Object>>> packReturn = packUpdateFields(obj, isAllColumns);
//        Map<String, Object> valueMap = packReturn.v1; // 字段及字段值
//        tableName = OrmUtil.isNotEmpty(tableName) ? tableName : packReturn.v2; // 表名
//        List<MBean.M2<String, Object>> idColumnList = packReturn.v3; // 主键及值
//        // 分析
//        List<String> fieldList = new ArrayList();
////        List<String> paramList = new ArrayList<>();
//        List<Object> valueList = new ArrayList<>();
//        for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
//            boolean present = idColumnList.stream().anyMatch(s -> s.v1.equalsIgnoreCase(entry.getKey()));
//            if (present) {
//                continue;
//            }// 路过id
//            fieldList.add(entry.getKey() + " = ? ");
//            valueList.add(entry.getValue());
//        }
//        //将id 拼接在 where 里面
//        if (idColumnList != null && idColumnList.size() > 0 && updateById) {
//            for (MBean.M2<String, Object> idColumn : idColumnList) {
//                condition += " and " + idColumn.v1 + " = ? ";
//                valueList.add(idColumn.v2);
//                LOG.info("key: " + idColumn.v1 + ", " + idColumn.v2);
//            }
//        }
//        // 拼接sql
//        String field = fieldList.stream().collect(Collectors.joining(","));
//        String sql = "update `" + tableName + "` set " + field + " where 1=1 " + condition;
//        // 执行sql
//        LOG.info("sql: " + sql);
//        LOG.info("params:" + JSON.toJSONString(valueMap));
//        return template.update(sql, valueList.toArray());
//    }
//
//    // 更新
//    public static int[] batchUpdate(JdbcTemplate template, List list, boolean updateById, String tableName) throws IllegalAccessException {
//        String condition = "";
//        if (list == null || list.size() == 0) {
//            return new int[]{0};
//        }
//
//        String sql = null;
//        List<Object[]> values = new ArrayList<>();
//        for (Object obj : list) {
//            // 查出字段名及字段值
//            MBean.M3<Map<String, Object>, String, List<MBean.M2<String, Object>>> packReturn = packUpdateFields(obj, true);
//            Map<String, Object> valueMap = packReturn.v1; // 字段及字段值
//            tableName = OrmUtil.isNotEmpty(tableName) ? tableName : packReturn.v2; // 表名
//            List<MBean.M2<String, Object>> idColumnList = packReturn.v3; // 主键及值
//            // 分析
//            List<String> fieldList = new ArrayList();
////        List<String> paramList = new ArrayList<>();
//            List<Object> valueList = new ArrayList<>();
//            for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
//                boolean present = idColumnList.stream().anyMatch(s -> s.v1.equalsIgnoreCase(entry.getKey()));
//                if (present) {
//                    continue;
//                }// 路过id
//                fieldList.add(entry.getKey() + " = ? ");
//                valueList.add(entry.getValue());
//            }
//            //将id 拼接在 where 里面
//            if (idColumnList != null && idColumnList.size() > 0 && updateById) {
//                for (MBean.M2<String, Object> idColumn : idColumnList) {
//                    condition += " and " + idColumn.v1 + " = ? ";
//                    valueList.add(idColumn.v2);
//                    LOG.info("key: " + idColumn.v1 + ", " + idColumn.v2);
//                }
//            }
//            values.add(valueList.toArray());
//            // 拼接sql
//            String field = fieldList.stream().collect(Collectors.joining(","));
//            sql = (sql == null ? "update " + tableName + " set " + field + " where 1=1 " + condition : sql);
//        }
//
//        // 执行sql
//        LOG.info("sql: " + sql);
//        LOG.info("size:" + values.size());
//        return template.batchUpdate(sql, values);
//    }
//
//    public static <T> int deleteByIdList(JdbcTemplate template, List<String> idList, Class<T> targetClass) {
//        return deleteByIdList(template, idList, targetClass, null);
//    }
//
//    public static <T> int deleteByIdList(JdbcTemplate template, List<String> idList, Class<T> targetClass, String tableName) {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        tableName = OrmUtil.isNotEmpty(tableName) ? tableName : tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        String idColumn = tableInfo.v3;
//        // 拼接sql
//        String sql = "delete from `" + tableName + "` where " + idColumn + " in ( ? ) ";
//        // 执行
//        return template.update(sql, idList.toArray());
//    }
//
//    public static <T> int deleteByCond(JdbcTemplate template, String cond, Class<T> targetClass) {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        String idColumn = tableInfo.v3;
//        // 拼接sql
//        String sql = "delete from " + tableName + " where 1=1 " + cond;
//        LOG.info("sql: " + sql);
//        // 执行
//        return template.update(sql);
//    }
//
//    public static <T> T queryById(JdbcTemplate template, Class<T> targetClass, String id) throws Exception {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        String idColumn = tableInfo.v3;
//        // 拼接sql
//        String column = "`" + columns.stream().collect(Collectors.joining("`,`")) + "`";
//        String sql = "select " + column + " from " + tableName + " where " + idColumn + " = " + id;
//        // 执行
//        Map<String, Object> map = template.queryForMap(sql);
//        if (targetClass == Map.class) {
//            return (T) map;
//        }
//        if (map != null) {
//            return parseObject(map, targetClass, null, null);
//        }
//        return null;
//    }
//
//    public static <T> List<T> queryByIdList(JdbcTemplate template, Class<T> targetClass, List<String> idList) throws Exception {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        String idColumn = tableInfo.v3;
//        // 拼接sql
//        String column = "`" + columns.stream().collect(Collectors.joining("`,`")) + "`";
//        String sql = "select " + column + " from " + tableName + " where " + idColumn + " in ( " + OrmUtil.convertArrayToStr(idList) + " ) ";
//        // 查询
//        Map<String, Object> param = new HashMap<>();
//        List<Map<String, Object>> mapList = queryList(template, sql, param);
//        if (mapList != null && mapList.size() > 0) {
//            return parseList(mapList, targetClass, null);
//        }
//        return null;
//    }
//
//    public static <T> List<T> queryByCond(JdbcTemplate template, String condition, Class<T> targetClass) throws Exception {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        // 拼接sql
//        String column = "`" + columns.stream().collect(Collectors.joining("`,`")) + "`";
//        String sql = "select " + column + " from " + tableName + (OrmUtil.isNotEmpty(condition) ? " where 1=1 " + condition : "");
//        // 查询
//        List<Map<String, Object>> mapList = queryList(template, sql, (Map<String, Object>) null);
//        if (mapList != null && mapList.size() > 0) {
//            return parseList(mapList, targetClass, null);
//        }
//        return null;
//    }
//
//    public static <T> List<T> queryByCond(JdbcTemplate template, String condition, Map<String, Object> param, Class<T> targetClass) throws Exception {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        // 拼接sql
//        String column = "`" + columns.stream().collect(Collectors.joining("`,`")) + "`";
//        String sql = "select " + column + " from " + tableName + (OrmUtil.isNotEmpty(condition) ? " where 1=1 " + condition : "");
//        // 查询
//        List<Map<String, Object>> mapList = queryList(template, sql, param);
//        if (mapList != null && mapList.size() > 0) {
//            return parseList(mapList, targetClass, null);
//        }
//        return null;
//    }
//
//    public static <T> List<T> queryByCond(JdbcTemplate template, String condition, Object[] param, Class<T> targetClass) throws Exception {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        List<String> columns = tableInfo.v2;
//        // 拼接sql
//        String column = "`" + columns.stream().collect(Collectors.joining("`,`")) + "`";
//        String sql = "select " + column + " from " + tableName + (OrmUtil.isNotEmpty(condition) ? " where 1=1 " + condition : "");
//
//        // 查询
//        List<Map<String, Object>> mapList = queryList(template, sql, param);
//        if (mapList != null && mapList.size() > 0) {
//            return parseList(mapList, targetClass, null);
//        }
//        return null;
//    }
//
//    public static <T> Long countByCond(JdbcTemplate template, String condition, Class<T> targetClass) {
//        // 分析类
//        MBean.M3<String, List<String>, String> tableInfo = getTableInfo(targetClass);
//        String tableName = tableInfo.v1;
//        // 拼接sql
//        String sql = "select count(0) from " + tableName + " where 1=1 " + condition;
//        // 查询
//        Long result = template.queryForObject(sql, Long.class);
//        return result;
//    }
//
//
//    private static void setField(Object origObj, Field field, Object obj) throws Exception {
//        if (null == obj) {
//            return;
//        }
//        try {
//            field.setAccessible(true);
//            field.set(origObj, obj);
//        } catch (Exception e) {
//            // 设置值失败时, 对值类型进行转换
//            Object tmpObj = typeConvert((Class<?>) field.getGenericType(), obj);
//            field.set(origObj, tmpObj);
//        }
//    }
//
//    private static <T> T typeConvert(Class<T> targetClass, Object value) throws Exception {
//        if (null == value) {
//            return null;
//        }
//        //转换
//        if (short.class == targetClass || Short.class.isAssignableFrom(targetClass)) {
//            return (T) Short.valueOf(value.toString());
//        } else if (int.class == targetClass || Integer.class.isAssignableFrom(targetClass)) {
//            return (T) Integer.valueOf(value.toString());
//        } else if (long.class == targetClass || Long.class.isAssignableFrom(targetClass)) {
//            return (T) Long.valueOf(value.toString());
//        } else if (float.class == targetClass || Float.class.isAssignableFrom(targetClass)) {
//            return (T) Float.valueOf(value.toString());
//        } else if (double.class == targetClass || Double.class.isAssignableFrom(targetClass)) {
//            return (T) Double.valueOf(value.toString());
//        } else if (BigDecimal.class.isAssignableFrom(targetClass)) {
//            return (T) new BigDecimal(value.toString());
//        } else if (value != null && value.getClass().isArray() && byte.class == value.getClass().getComponentType()) {
//            return (T) new String((byte[]) value, "utf-8");
//        } else if (value instanceof LocalDateTime && value.getClass() != targetClass && Date.class.isAssignableFrom(targetClass)) {
//            //转换日期
//            LocalDateTime ldt = (LocalDateTime) value;
////            ZonedDateTime zdt = ldt.atZone(ZoneId.of("UTC+8"));
//            ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
//            Date date = Date.from(zdt.toInstant());
//            return (T) date;
//        } else {
//            return (T) value;
//        }
//    }
//}
